import { AxiosRequestConfig, AxiosResponse } from 'axios';
import { getRequestKey, type RequestKey } from '../helper/requestKey';

/**
 * 重复请求取消
 */
class RequestCancel {
  private abortMap = new Map<RequestKey, AbortController['abort']>();

  /**
   * 记录
   */
  private record(config: AxiosRequestConfig) {
    const key = getRequestKey(config);
    const controller = new AbortController();
    config.signal = controller.signal;
    this.abortMap.set(key, () => controller.abort());
  }

  /**
   * 移除
   */
  private remove(config: AxiosRequestConfig) {
    const key = getRequestKey(config);
    this.abortMap.delete(key);
  }

  /**
   * 取消
   */
  private cancel(config: AxiosRequestConfig) {
    const key = getRequestKey(config);
    const abort = this.abortMap.get(key);
    abort && abort();
  }

  /**
   * 处理请求
   * @description 同一请求仅保留最新的，之前的全部取消
   */
  handleRequest(config: AxiosRequestConfig) {
    this.cancel(config);
    this.record(config);
  }

  /**
   * 处理响应
   * @description 获得响应后，删除当前请求的记录
   */
  handleResponse(response: AxiosResponse) {
    this.remove(response.config);
  }
}

const requestCancel = new RequestCancel();

export default requestCancel;
